package com.hbwxz.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 打印日志切面
 *
 * @author shenzw
 * @date 2024/1/8
 */
@Aspect // 注解标注，定义切面
@Component // 组件
@Slf4j // Slf4j打印日志
public class LogAspect {

    /**
     * 定义切点（排除某个方法 && !execution(* com.hbwxz.controller.UserController.*(..))）
     *
     * @Pointcut("execution(* com.hbwxz.*(..)) " +
     * "&& !execution(* com.hbwxz.controller.UserController.*(..))")
     */
    @Pointcut("@annotation(com.hbwxz.aop.anno.JobLogPointCut)")
    public void jobLog() {
        // 定义切点
    }

    /**
     * 环绕通知这里的方法就是上面定义的切入点
     *
     * @param joinPoint 切点
     * @return Object
     */
    @Around("jobLog()")
    public Object around(ProceedingJoinPoint joinPoint) {

        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); // 获取方法
        String name = method.getName(); // 执行方法名

        Object proceed = null;
        log.info("Method = {} before strengthen", name);
        try {
            proceed = joinPoint.proceed();// 执行具体业务方法
            log.info("Method = {} after strengthen", name);
        } catch (Throwable e) {
            log.error("Method = {} is error", name, e);
        }


        return proceed;

    }
}
